Fondamenti di Informatica II --  A.A. 2005/2006

Docente: Prof. Paolino Di Felice

 

Corso di Studio:  Ingegneria Informatica-Automatica

(Anno di corso:  I -- CFU: 6)

 

Obiettivi

Il Corso fornisce un'ampia rassegna critica di strutture dati e algoritmi fondamentali nella soluzione automatica di problemi, unitamente ai metodi di analisi delle prestazioni dei programmi e loro sviluppo e messa a punto. Tutte le soluzioni presentate in classe sono state realizzate al calcolatore utilizzando il linguaggio di programmazione C++ introdotto a Fondamenti d’Informatica I.

 

Saper fare

Progettazione, sviluppo e messa a punto di programmi efficienti riguardanti un’ampia categoria di problemi fondamentali utilizzando il linguaggio C++.

 

 

Contenuti

 

PARTE I - Requisiti dei programmi 

Obiettivo: discutere i principali requisiti che ogni buon programma deve possedere, quindi soffermarsi su uno di essi: l'efficienza spazio-temporale, fornendo metodi generali per la sua valutazione.

Il metodo dei dati di prova, i livelli di correttezza. Analisi dei programmi: efficienza spaziale e temporale dei programmi. L'efficienza temporale: il modello dei costi per i costrutti presenti nei linguaggi ad alto livello (il caso del C++), la funzione costo temporale (t(n)), la dimensione dell'input (n), la configurazione dell'input (caso peggiore, medio e migliore). La complessità computazionale dei programmi: la notazione O(g(n)). Un metodo per la determinazione della t(n): il conteggio delle frequenze. Il passaggio dalla t(n) alla O(g(n)). Un teorema che governa tale passaggio nel caso di funzioni costo di tipo polinomiale. Il metodo per la determinazione diretta della O(g(n)) basato sulla regola della somma e del prodotto. Determinazione della t(n) nel caso di codici ricorsivi. L'efficienza spaziale: la funzione costo spaziale (s(n)) e la notazione O(g(n)). Studio di casi.

 

PARTE II – Tecniche di rappresentazione fondamentali e strutture dati

Obiettivo: a) introdurre le tecniche di rappresentazione, nella memoria centrale del calcolatore, delle principali strutture discrete che intervengono nella modellazione dei dati coinvolti nella soluzione automatica di problemi rilevanti; b) nel mostrarne la realizzazione (le strutture dati -- SD) in C++; c) analisi critica dell’occupazione di memoria causata dalle diverse soluzioni proposte.

 

Liste: rappresentazione tramite array (r. sequenziale), r. tramite puntatore in avanti (r. collegata), r. tramite puntatore in avanti e indietro (r.  collegata simmetrica).

Pile: rappresentazione tramite array (r. sequenziale), r. tramite puntatori (r. collegata).

Code: rappresentazione tramite array (r. sequenziale), r. tramite puntatori (r. collegata).

Matrici sparse: rappresentazione compatta a 3 informazioni (r.1) e r. tramite vettore di accesso (r.2) (r. sequenziali), r. compatta a 3 informazioni (r.3) e r. tramite vettore di accesso mediante l’uso di puntatori (r.4) (r. collegate), r. compatta tramite doppio vettore di accesso mediante l’uso di puntatori (r.5).

Insiemi: rappresentazione tramite array (r. sequenziale), r. tramite puntatori (r. collegata).

Grafi: rappresentazione tramite matrice delle adiacenze, r. compatta tramite vettore di accesso dinamico della matrice delle adiacenze (alias, liste dei successori).

Alberi: rappresentazione tramite puntatori (r. collegata) di alberi binari e alberi ennari.

 

 

 

PARTE III – Algoritmi fondamentali e loro codifica

Obiettivo: a) passare in rassegna i principali algoritmi noti per la soluzione di problemi classici dell'informatica quali: la visita di grafi ed alberi, l'ordinamento di  un insieme di valori, la ricerca di un elemento in un insieme di valori e/o in un albero binario di ricerca, la fusione di sequenze ordinate, l’unione di insiemi, ecc; b) discuterne la soluzione C++ ed i relativi costi computazionali.

 

Operazioni sulle liste (creazione, aggiunta di un atomo, estrazione del primo atomo, test di appartenenza di un atomo ad una lista, stampa atomi, stampa bidirezionale atomi, concatenazione di due liste, fusione di due liste, conteggio atomi con medesimo valore su due liste distinte, inversione atomi lista).

Operazioni sulle pile (creazione, stampa atomi, conta atomi, aggiunta/eliminazione atomo).

Operazioni sulle code (creazione, stampa atomi, conta atomi, aggiunta/eliminazione atomo, concatenazione di due code).

Operazioni sulle matrici sparse (leggi/stampa matrice, cerca massimo/minimo valore, aggiorna valore, permuta righe, somma).

Operazioni sugli insiemi (creazione, stampa elementi, unione/differenza/intersezione di due insiemi, ricerca esaustiva di un valore, ricerca binaria iterativa/ricorsiva di un valore, ordinamento dei valori di un insieme: algoritmo a bolle, per selezione e merge-sort).

Operazioni sui grafi (creazione e stampa di un grafo, aggiunta di un ramo/nodo, eliminazione di un ramo/nodo, visita in profondità di un grafo, grado di ingresso/uscita di un nodo).

Operazioni sugli alberi binari e alberi binari di ricerca (visita in preordine, postordine e simmetrica, ricerca di un elemento, stampa in notazione parentetica dei nodi, cancella albero). Operazioni sugli alberi ennari (visita in preordine e in postordine).

 

Testo di riferimento

P. Di Felice, Lezioni di Fondamenti di informatica, II, Libreria Universitaria Benedetti Editrice, 2006.

 

MODALITA' D’ESAME: L’esame verte in una prova scritta ed in una prova orale.

Prerequisiti per l’ammissione all’esame:  Aver superato Fondamenti di Informatica I.

 

Torna indietro             Home page